package com.cyzy.server.service.impl;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Scanner;

public class CaptchaVerification {

    public static void main(String[] args) throws Exception {
        // 获取桌面路径
        String desktopPath = System.getProperty("user.home") + "/Desktop/";

        // 请求验证码图片并保存到桌面
        URL captchaUrl = new URL("http://jwxt.gdufe.edu.cn/jsxsd/verifycode.servlet");
        HttpURLConnection captchaConnection = (HttpURLConnection) captchaUrl.openConnection();
        captchaConnection.setRequestMethod("GET");

        // 发送请求并获取响应
        int responseCode = captchaConnection.getResponseCode();
        if (responseCode == HttpURLConnection.HTTP_OK) {
            // 读取验证码图片
            InputStream captchaStream = captchaConnection.getInputStream();
            BufferedImage captchaImage = ImageIO.read(captchaStream);

            // 保存验证码图片到桌面
            saveImage(captchaImage, desktopPath + "captcha.png");

            System.out.println("验证码图片已保存到桌面。");

            // 获取用户输入的验证码
            Scanner scanner = new Scanner(System.in);
            System.out.print("请输入验证码：");
            String captchaCode = scanner.nextLine();

            // 进行手动验证
            if (validateCaptcha(captchaCode)) {
                System.out.println("验证码验证成功！");
            } else {
                System.out.println("验证码验证失败！");
            }
        } else {
            System.out.println("Failed to fetch captcha image. Response code: " + responseCode);
        }
    }

    // 保存验证码图片到指定路径
    private static void saveImage(BufferedImage image, String filePath) throws IOException {
        File outputFile = new File(filePath);
        ImageIO.write(image, "png", outputFile);
    }

    // 手动验证验证码
    private static boolean validateCaptcha(String userInput) {
        // 此处应该与服务器进行交互，验证用户输入的验证码的正确性
        // 通常情况下，验证验证码的正确性需要将用户输入的验证码发送到服务器，然后等待服务器的响应
        // 服务器会将用户输入的验证码与实际生成的验证码进行比对，如果一致，则返回验证成功的响应，否则返回验证失败的响应
        // 在本例中，我们假设服务器的验证码验证接口返回一个布尔值，表示验证码是否正确

        // 实际情况下，这里应该调用服务器的验证码验证接口，将用户输入的验证码发送到服务器进行验证
        // 并根据服务器的响应来判断验证码的正确性

        // 假设服务器的验证码验证接口返回一个布尔值，表示验证码是否正确
        boolean isCaptchaValid = callServerCaptchaValidationAPI(userInput);

        // 返回验证码验证结果
        return isCaptchaValid;
    }

    // 调用服务器的验证码验证接口
    private static boolean callServerCaptchaValidationAPI(String userInput) {
        try {
            // 服务器的验证码验证接口URL
            String verificationUrl = "http://jwxt.gdufe.edu.cn/jsxsd/verifycode.servlet" + URLEncoder.encode(userInput, "UTF-8");

            // 创建URL对象
            URL url = new URL(verificationUrl);

            // 创建HTTP连接
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();

            // 设置请求方法
            connection.setRequestMethod("GET");

            // 获取响应码
            int responseCode = connection.getResponseCode();

            // 读取响应内容
            BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            StringBuilder response = new StringBuilder();
            String line;

            while ((line = reader.readLine()) != null) {
                response.append(line);
            }

            // 关闭Reader
            reader.close();

            // 根据响应码和响应内容判断验证结果
            if (responseCode == HttpURLConnection.HTTP_OK) {
                // 假设服务器返回一个布尔值，表示验证码是否正确
                return "true".equals(response.toString().trim());
            } else {
                // 处理验证码验证请求失败的情况
                System.out.println("验证码验证请求失败，响应码：" + responseCode);
                return false;
            }
        } catch (IOException e) {
            // 处理验证码验证过程中的异常
            e.printStackTrace();
            return false;
        }
    }
}
